package com.hzit.dao.proxy;

import com.hzit.dao.UserDao;
import com.hzit.dao.impl.UserDaoImpl;
import org.aopalliance.intercept.Invocation;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 类名：
 * 作者：WF
 * 功能：使用JDK的方式实现动态代理
 */
public class UserDaoImplDynamicProxyJDK implements InvocationHandler {

	private UserDao userDao;
	public UserDaoImplDynamicProxyJDK(){
		userDao = new UserDaoImpl();
	}
	//1. 创建动态代理对象
	public UserDao createProxy(){
		//1.1 参数说明
		// 参数1：代表当前的代理对象的类加载器
		// 参数2：代表目标对象所实现的所有接口类型数组
		// 参数3：实现了InvocationHandler接口的对象
		UserDao o = (UserDao) Proxy.newProxyInstance(this.getClass().getClassLoader(), userDao.getClass().getInterfaces(), this);
		return o;
	}
	//2. 在后台调用你的目标对象的方法
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		//2.1 如果当前调用的目标对象的方法名叫query，就调用当前的checkSecurity（）进行安全性检查
		if (method.getName().equals("query")) {
			checkSecurity();
		}
		//2.2 通过反射调用目标对象的方法
		Object obj = method.invoke(userDao, args);
		return obj;
	}

	private void checkSecurity(){
		System.out.println("进行安全性检查（JDK动态代理）。。。");
	}
}
